/** ***********************************************************************************
* @file         lbs_task.h
* @brief        系统RTC管理任务 头文件
* @details      主要用来管理系统RTC时钟，以及数据接口
* @author       杨小珛
* @date         2022/07/08
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/
#ifndef LBS_TASK_H
#define LBS_TASK_H

#include "os_app.h"

/*
type: 定位类型，0:没有得到定位结果;1:gps 定位结果;2:wifi定位结果;3:混合定位 结果;4:基站定位结果;5:其他--
latitude: 纬度，正数为北纬，精确到0.00001分
longitude: 经度，正数为东经，精确到0.00001分
*/
typedef void (*lbs_wifiscan_recv_fun_t)( uint8_t type, uint32_t latitude, uint32_t longitude );

/********************LBS消息数据结构*************************************/
typedef struct
{
    uint16_t mcc;
    uint16_t mnc;
    uint32_t lac;
    uint32_t cellid;
    int16_t signal;
} lbs_cellinfo_t;

#define LBS_CELLINFO_MAX_NUM    ( 9 )
typedef struct
{
    uint8_t scell_num;                          /*SCELL 个数 1数据正常*/
    lbs_cellinfo_t service;                     /*连接基站信息*/
    uint8_t ncell_num;                          /*NCELL 个数 0~9*/
    lbs_cellinfo_t ncell[LBS_CELLINFO_MAX_NUM]; /*周边基站信息*/
}lbs_cellinfo_msg_t;

/********************WIFI消息数据结构*************************************/
#define WIFISCAN_AP_ADDR_MAX_LEN    ( 20 )      /*WIFI MAC地址*/
#define WIFISCAN_AP_NUM_MAX_LEN     ( 30 )      /*WIFI AP最大数量*/

typedef struct
{
	int8_t  ap_rssi;
	uint8_t ap_addr[WIFISCAN_AP_ADDR_MAX_LEN];
} wifiscan_info_t;

typedef struct
{
    uint8_t mac_num;                                /*MAC地址的数量*/
    wifiscan_info_t infor[WIFISCAN_AP_NUM_MAX_LEN]; /*WIFI 地址信息*/
}wifiscan_infor_msg_t;

/********************WIFI消息数据结构*************************************/
#define LBS_ONLY_READ   ( 0x00000001 )  /*仅基站方式读取*/
#define LBS_WIFI_READ   ( 0x00000002 )  /*基站+WIFI方式读取*/
#define LBS_TIME_READ   ( 0x00000003 )  /*周期性读取，暂时不支持*/
#define WIFI_ONLYE_READ ( 0x00000004 )  /*仅WIFI定位方式*/

typedef  struct
{
	uint32_t mode;
    uint32_t time;
	lbs_wifiscan_recv_fun_t fun;
}lbs_wifscan_msg_typedef;

#define LBS_WIFISCAN_MSG_QUEUE_DEPTH  ( 5 )

/********************辅助定位数据结构*************************************/
typedef  struct
{
    uint8_t     type;                    // 定位类型，0:没有得到定位结果;1:gps 定位结果;2:wifi定位结果;3:混合定位 结果;4:基站定位结果;5:其他--
    uint32_t    latitude;                // 纬度，正数为北纬，精确到0.00001分
    uint32_t    longitude;               // 经度，正数为东经，精确到0.00001分
}lbs_wifiscan_locating_infor_t;

/*******************百度云平台KEY值数据结构********************************/
#define LBS_WIFISCAN_KEY_LEN    ( 128 )
typedef  struct
{
    uint8_t     len;                        //AK 参数数据长度
    uint8_t     ak[LBS_WIFISCAN_KEY_LEN];   //AK 数据空间
}lbs_wifiscan_key_infor_t;

/** ****************************************************************************
* @remarks       void lbs_wifiscan_man_create_task( unsigned portBASE_TYPE uxPriority )
* @brief         LBS\WIFISCAN 辅助定位数据信息管理
* @param[in]     uxPriority任务优先级；
* @param[out]    无
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
extern void lbs_wifiscan_man_create_task( unsigned portBASE_TYPE uxPriority );

/** ****************************************************************************
* @remarks       void lbs_wifiscan_key_cfg_init( lbs_wifiscan_key_infor_t *key_cfg )
* @brief         初始化LBS KEY 配置参数
* @param[in]     *key_cfg 初始化数据
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void lbs_wifiscan_key_cfg_init( lbs_wifiscan_key_infor_t *key_cfg );

/** ****************************************************************************
* @remarks       uint32_t lbs_wifiscan_coordinate_position_read( uint32_t mode, uint32_t time, lbs_wifiscan_recv_fun_t fun )
* @brief         读取LBS 辅助定位信息
* @param[in]     mode 读取数据模式，time 周期时间（预留），fun 回调函数
* @param[out]    无
* @return        pdPASS-成功，pdFAIL-失败
* @attention     无
*******************************************************************************/
extern uint32_t lbs_wifiscan_coordinate_position_read( uint32_t mode, uint32_t time, lbs_wifiscan_recv_fun_t fun );

/** ****************************************************************************
* @remarks       uint32_t lbs_wifiscan_key_save_flash_write( lbs_wifiscan_key_infor_t *key_cfg )
* @brief         保存LBS KEY 配置参数到外部FLASH中
* @param[in]     *key_cfg 保存数据源地址
* @param[out]    无
* @return        pdPASS 成功 pdFAIL 失败
* @attention     无
*******************************************************************************/
extern uint32_t lbs_wifiscan_key_save_flash_write( uint8_t *data, uint16_t len );

/** ****************************************************************************
* @remarks       uint32_t lbs_wifiscan_key_save_flash_write( lbs_wifiscan_key_infor_t *key_cfg )
* @brief         保存LBS KEY 配置参数到外部FLASH中
* @param[in]     *key_cfg 保存数据源地址
* @param[out]    无
* @return        pdPASS 成功 pdFAIL 失败
* @attention     无
*******************************************************************************/
extern uint8_t lbs_wifiscan_key_save_flash_read( uint8_t *data );

/** ****************************************************************************
* @remarks       uint32_t lbs_wifiscan_key_save_flash_read( lbs_wifiscan_key_infor_t *key_cfg )
* @brief         读取 LBS KEY 配置参数
* @param[in]     无
* @param[out]    *key_cfg 读取数据目标地址
* @return        pdPASS 成功 pdFAIL 失败
* @attention     无
*******************************************************************************/
extern void lbs_wifiscan_key_save_flash_clear( void );

/** ****************************************************************************
* @remarks       uint8_t get_lbs_cellinfo( uint8_t * pu8LbsCellInfoData )
* @brief         获取LBS读取到的信息
* @param[in]     用于存储LBS信息的地址
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
 uint8_t get_lbs_cellinfo( uint8_t * pu8LbsCellInfoData );

#endif

